<?php

if(!function_exists('image_url'))
{
    function image_url($url)
    {
        if(empty($url))        {
            return $url;
        }
        $path = parse_url($url);

        if(empty($path['host']))
        {
            $url = $url[0] == '/'? config('filesystems.base_url').$url:config('filesystems.base_url').'/'.$url;
        }

        return $url;
    }
}

/*
*  md5签名，$array中务必包含 appSecret
*/
function sign($array){
    ksort($array);
    $string="";
    while (list($key, $val) = each($array)){
        $string = $string . $val ;
    }
    return md5($string);
}
/*
*  签名验证,通过签名验证的才能认为是合法的请求
*/
function signVerify($appSecret,$array){
    $newarray=array();
    $newarray["appSecret"]=$appSecret;
    reset($array);
    while(list($key,$val) = each($array)){
        if($key != "sign" ){
            $newarray[$key]=$val;
        }

    }
    $sign=sign($newarray);
    if($sign == $array["sign"]){
        return true;
    }
    return false;
}
/*
*构建参数请求的URL
*/
function AssembleUrl($url, $array)
{
    unset($array['appSecret']);
    foreach ($array as $key=>$value) {
        $url=$url.$key."=".urlencode($value)."&";
    }
    return $url;
}

/*
*  生成自动登录地址
*  通过此方法生成的地址，可以让用户免登录，进入积分兑换商城
*/
function buildCreditAutoLoginRequest($appKey,$appSecret,$uid,$credits){
    $url = "http://www.duiba.com.cn/autoLogin/autologin?";
    $timestamp=time()*1000 . "";
    $array=array("uid"=>$uid,"credits"=>$credits,"appSecret"=>$appSecret,"appKey"=>$appKey,"timestamp"=>$timestamp);
    $sign=sign($array);
    $array['sign']=$sign;
    $url=AssembleUrl($url,$array);
    return $url;
}

/*
*  生成直达商城内部页面的免登录地址
*  通过此方法生成的免登陆地址，可以通过redirect参数，跳转到积分商城任意页面
*/
function buildRedirectAutoLoginRequest($appKey,$appSecret,$uid,$credits,$redirect){
    $url = "http://www.duiba.com.cn/autoLogin/autologin?";
    $timestamp=time()*1000 . "";
    $array=array("uid"=>$uid,"credits"=>$credits,"appSecret"=>$appSecret,"appKey"=>$appKey,"timestamp"=>$timestamp);
    if($redirect!=null){
        $array['redirect']=$redirect;
    }
    $sign=sign($array);
    $array['sign']=$sign;
    $url=AssembleUrl($url,$array);
    return $url;
}



/*
*  生成订单查询请求地址
*  orderNum 和 bizId 二选一，不填的项目请使用空字符串
*/
function buildCreditOrderStatusRequest($appKey,$appSecret,$orderNum,$bizId){
    $url="http://www.duiba.com.cn/status/orderStatus?";
    $timestamp=time()*1000 . "";
    $array=array("orderNum"=>$orderNum,"bizId"=>$bizId,"appKey"=>$appKey,"appSecret"=>$appSecret,"timestamp"=>$timestamp);
    $sign=sign($array);
    $url=$url . "orderNum=" . $orderNum . "&bizId=" . $bizId . "&appKey=" . $appKey . "&timestamp=" . $timestamp . "&sign=" . $sign ;
    return $url;
}
/*
*  兑换订单审核请求
*  有些兑换请求可能需要进行审核，开发者可以通过此API接口来进行批量审核，也可以通过兑吧后台界面来进行审核处理
*/
function buildCreditAuditRequest($appKey,$appSecret,$passOrderNums,$rejectOrderNums){
    $url="http://www.duiba.com.cn/audit/apiAudit?";
    $timestamp=time()*1000 . "";
    $array=array("appKey"=>$appKey,"appSecret"=>$appSecret,"timestamp"=>$timestamp);
    if($passOrderNums !=null && !empty($passOrderNums)){
        $string=null;
        while(list($key,$val)=each($passOrderNums)){
            if($string == null){
                $string=$val;
            }else{
                $string= $string . "," . $val;
            }
        }
        $array["passOrderNums"]=$string;
    }
    if($rejectOrderNums !=null && !empty($rejectOrderNums)){
        $string=null;
        while(list($key,$val)=each($rejectOrderNums)){
            if($string == null){
                $string=$val;
            }else{
                $string= $string . "," . $val;
            }
        }
        $array["rejectOrderNums"]=$string;
    }
    $sign = sign($array);
    $url=$url . "appKey=".$appKey."&passOrderNums=".$array["passOrderNums"]."&rejectOrderNums=".$array["rejectOrderNums"]."&sign=".$sign."&timestamp=".$timestamp;
    return $url;
}
/*
*  积分消耗请求的解析方法
*  当用户进行兑换时，兑吧会发起积分扣除请求，开发者收到请求后，可以通过此方法进行签名验证与解析，然后返回相应的格式
*  返回格式为：
*  成功：{"status":"ok", 'errorMessage':'', 'bizId': '20140730192133033', 'credits': '100'}
*  失败：{'status': 'fail','errorMessage': '失败原因（显示给用户）','credits': '100'}
*/
function parseCreditConsume($appKey,$appSecret,$request_array){
    if($request_array["appKey"] != $appKey){
        throw new Exception("appKey not match");
    }
    if($request_array["timestamp"] == null ){
        throw new Exception("timestamp can't be null");
    }
    $verify=signVerify($appSecret,$request_array);
    if(!$verify){
        throw new Exception("sign verify fail");
    }

    $ret=$request_array;
    return $ret;
}

/*
    *  加积分请求的解析方法
    *  当用点击签到，或者有签到弹层时候，兑吧会发起加积分请求，开发者收到请求后，可以通过此方法进行签名验证与解析，然后返回相应的格式
    *  返回格式为：
    *  成功：{"status":"ok", 'errorMessage':'', 'bizId': '20140730192133033', 'credits': '100'}
    *  失败：{'status': 'fail','errorMessage': '失败原因（显示给用户）','credits': '100'}
    */
function addCreditsConsume($appKey,$appSecret,$request_array){
    if($request_array["appKey"] != $appKey){
        throw new Exception("appKey not match");
    }
    if($request_array["timestamp"] == null ){
        throw new Exception("timestamp can't be null");
    }
    $verify=signVerify($appSecret,$request_array);
    if(!$verify){
        throw new Exception("sign verify fail");
    }

    $ret=$request_array;
    return $ret;
}


/*
    *  虚拟商品充值的解析方法
    *  当用兑换虚拟商品时候，兑吧会发起虚拟商品请求，开发者收到请求后，可以通过此方法进行签名验证与解析，然后返回相应的格式
    *  返回格式为：
    *   成功：   {status:"success",credits:"10", supplierBizId:"no123456"}
    *	处理中： {status:"process ",credits:"10" , supplierBizId:"no123456"}
    *	失败：   {status:"fail ", errorMessage:"签名签证失败", supplierBizId:"no123456"}
    */
function virtualRecharge($appKey,$appSecret,$request_array){
    if($request_array["appKey"] != $appKey){
        throw new Exception("appKey not match");
    }
    if($request_array["timestamp"] == null ){
        throw new Exception("timestamp can't be null");
    }
    $verify=signVerify($appSecret,$request_array);
    if(!$verify){
        throw new Exception("sign verify fail");
    }

    $ret=$request_array;
    return $ret;
}


/*
*  兑换订单的结果通知请求的解析方法
*  当兑换订单成功时，兑吧会发送请求通知开发者，兑换订单的结果为成功或者失败，如果为失败，开发者需要将积分返还给用户
*/
function parseCreditNotify($appKey,$appSecret,$request_array){
    if($request_array["appKey"] != $appKey){
        throw new Exception("appKey not match");
    }
    if($request_array["timestamp"] == null ){
        throw new Exception("timestamp can't be null");
    }
    $verify=signVerify($appSecret,$request_array);
    if(!$verify){
        throw new Exception("sign verify fail");
    }
    $ret=array("success"=>$request_array["success"],"errorMessage"=>$request_array["errorMessage"],"bizId"=>$request_array["bizId"]);
    return $ret;
}


